package com.framework.macros;

import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.CheckEvent;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.ext.AfterCompose;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Popup;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;


/**
 * Macrocomponente, para indicar los dias
 * @author Luis Miguel
 * */
public class DiasSemanaMacro extends Textbox implements AfterCompose{
	
//	private static Logger log = Logger.getLogger(DiasSemanaMacro.class);

   private Popup popupObservaciones = null;
	
	private Window window;
	private Textbox textbox;
	
	private Checkbox chDomingo;
	private Checkbox chLunes;
	private Checkbox chMartes;
	private Checkbox chMiercoles;
	private Checkbox chJueves;
	private Checkbox chViernes;
	private Checkbox chSabado;
	
	
	// Variables que contienen el patron del día.
	private static final String PATRON_DOMINGO = "(D)";
	private static final String PATRON_LUNES = "(L)";
	private static final String PATRON_MARTES = "(M)";
	private static final String PATRON_MIERCOLES = "(E)";
	private static final String PATRON_JUEVES = "(J)";
	private static final String PATRON_VIERNES = "(V)";
	private static final String PATRON_SABADO = "(S)";
	
	private OnNuevoPatronDiasSemanales onNuevoPatronDiasSemanales;
	
	public DiasSemanaMacro(Window window) {
		this.window = window;
		afterCompose();
	}
	
	/**
	 * @param window
	 * Dias de la semana
	 * @param domingo
	 * @param lunes
	 * @param martes
	 * @param  miercoles
	 * @param jueves
	 * @param viernes
	 * @param sabado
	 * */
	public DiasSemanaMacro(Window window, boolean domingo, boolean lunes,
			boolean martes, boolean miercoles, boolean jueves, boolean viernes,
			boolean sabado) {
		this.window = window;
		afterCompose();
		// Habilitamos los dias
		setDomingo(domingo);
		setLunes(lunes);
		setMartes(martes);
		setMiercoles(miercoles);
		setJueves(jueves);
		setViernes(viernes);
		setSabado(sabado); 
		traducirPatronUsuario(getPatronDias()); 
	}
	
	public DiasSemanaMacro() {
		
	}
	
	private void inicializarFechas() {
		chDomingo = new Checkbox();
		chLunes = new Checkbox();
		chMartes = new Checkbox();
		chMiercoles = new Checkbox();
		chJueves = new Checkbox();
		chViernes = new Checkbox();
		chSabado = new Checkbox();
		
		chDomingo.setLabel("Domingo");  
		chLunes.setLabel("Lunes");    
		chMartes.setLabel("Martes");  
		chMiercoles.setLabel("Miércoles");
		chJueves.setLabel("Jueves");  
		chViernes.setLabel("Viernes"); 
		chSabado.setLabel("Sábado"); 
		
		reiniciarCheckbox();
		cargarEventoDiasSemana();
	}
	
	/**
	 * Este metodo me permite cargar el evento en cada uno de los check
	 * */
	private void cargarEventoDiasSemana() {
		Checkbox checkbox[] = {chDomingo, chLunes, chMartes, chMiercoles, chJueves, chViernes, chSabado};
		EventListener<CheckEvent> eventListener = new EventListener<CheckEvent>() {
			@Override
			public void onEvent(CheckEvent arg0) throws Exception {
				String patron_dias = getPatronDias();
				if(onNuevoPatronDiasSemanales != null){
					onNuevoPatronDiasSemanales.patronDiasSemana(patron_dias); 
				}
				traducirPatronUsuario(patron_dias);
			}
		};
		for (Checkbox checkboxTemp : checkbox) {
			 checkboxTemp.addEventListener(Events.ON_CHECK, eventListener);
		}
	}
  
	/**
	 * Convertimos el patron a lenguaje del usuario
	 * */
	protected void traducirPatronUsuario(String patron_dias) {
		if(patron_dias.equals(getTodosDias())){
			setValue("Todos los días");  
		}else if(patron_dias.equals(getLunesAViernes())){
			setValue("De Lunes a Viernes"); 
		}else if(patron_dias.equals(getLunesSabado())){
			setValue("De Lunes a Sábado");
		}else{
			StringBuilder patron_diasS = new StringBuilder();
	    	patron_diasS.append(isDomingo() ? chDomingo.getLabel() + "," : ""); 
	    	patron_diasS.append(isLunes() ? chLunes.getLabel()+ "," : ""); 
	    	patron_diasS.append(isMartes() ? chMartes.getLabel()+ "," : ""); 
	    	patron_diasS.append(isMiercoles() ? chMiercoles.getLabel()+ "," : ""); 
	    	patron_diasS.append(isJueves() ? chJueves.getLabel()+ "," : ""); 
	    	patron_diasS.append(isViernes() ? chViernes.getLabel()+ "," : ""); 
	    	patron_diasS.append(isSabado() ? chSabado.getLabel()+ "," : ""); 
	    	setValue(patron_diasS.toString().replaceAll("[,]$", ""));   
		}
	}
 
	private String getLunesSabado() {
		return PATRON_LUNES + PATRON_MARTES + PATRON_MIERCOLES + PATRON_JUEVES + PATRON_VIERNES + PATRON_SABADO;
	}

	private String getTodosDias() {
		return PATRON_DOMINGO + PATRON_LUNES + PATRON_MARTES + PATRON_MIERCOLES + PATRON_JUEVES + PATRON_VIERNES + PATRON_SABADO; 
	}

	private String getLunesAViernes() {
		return PATRON_LUNES + PATRON_MARTES + PATRON_MIERCOLES + PATRON_JUEVES + PATRON_VIERNES;
	}

	private void reiniciarCheckbox(){
		chDomingo.setChecked(false);  
		chLunes.setChecked(true);    
		chMartes.setChecked(true);  
		chMiercoles.setChecked(true);
		chJueves.setChecked(true);  
		chViernes.setChecked(true); 
		chSabado.setChecked(true); 
	}
 
	@Override
	public void afterCompose() {
			setReadonly(true);
			inicializarFechas();
			setStyle("cursor:pointer");  
			setTooltiptext("por favor, presionar para desplegar el campo..!!"); 
			addEventListener(Events.ON_CLICK, new EventListener<Event>() {
				@Override
				public void onEvent(Event event) throws Exception {
					//log.info("@onEvent cargando el evento."); 
					if(popupObservaciones == null)popupObservaciones = generarpopUp(); 	
	                popupObservaciones.open(DiasSemanaMacro.this, "after_end");
	                popupObservaciones.focus();
	                //log.info("@onEvent despues de cargar el evento.");
				}
			});
			traducirPatronUsuario(getPatronDias()); 
	}

	/**
	 * Este metodo se encarga de generar el popup
	 * @author Luis Miguel Hernandez
	 * */
	protected Popup generarpopUp() { 
		final Popup popup = new Popup();
		popup.addEventListener(Events.ON_OPEN, new EventListener<Event>() {
			@Override
			public void onEvent(Event event) throws Exception {
				
			}
		});
		
		Hbox hbox = new Hbox();
		hbox.appendChild(chDomingo);
		hbox.appendChild(chLunes);
		hbox.appendChild(chMartes);
		hbox.appendChild(chMiercoles);
		hbox.appendChild(chJueves);
		hbox.appendChild(chViernes);
		hbox.appendChild(chSabado);
		
		popup.appendChild(hbox);
		getPage().getFirstRoot().appendChild(popup);
		return popup;
	}
	
	@Override
	public void setText(String value) throws WrongValueException {
		super.setText(value);
		if(textbox != null){
			textbox.setValue(value);
		}
	}

	public Window getWindow() {
		return window;
	}

	public void setWindow(Window window) {
		this.window = window;
	}
	
	

    /**
     * Esta interface es el evento cuando el texto cambia
     * @author Luis Miguel
     * */
	public interface OnNuevoPatronDiasSemanales{
		void patronDiasSemana(String patron_dias);
	}
	
    public String getPatronDias(){
    	StringBuilder patron_dias = new StringBuilder();
    	patron_dias.append(isDomingo() ? PATRON_DOMINGO : ""); 
    	patron_dias.append(isLunes() ? PATRON_LUNES : ""); 
    	patron_dias.append(isMartes() ? PATRON_MARTES : ""); 
    	patron_dias.append(isMiercoles() ? PATRON_MIERCOLES : ""); 
    	patron_dias.append(isJueves() ? PATRON_JUEVES : ""); 
    	patron_dias.append(isViernes() ? PATRON_VIERNES : ""); 
    	patron_dias.append(isSabado() ? PATRON_SABADO : ""); 
    	return patron_dias.toString();
    }
	
	
	
	public void setPatronDias(String patron) {
		if(patron != null && !patron.trim().isEmpty()){
			 patron = patron.toUpperCase();
			 setDomingo(patron.contains(PATRON_DOMINGO)); 
		     setLunes(patron.contains(PATRON_LUNES));
		     setMartes(patron.contains(PATRON_MARTES));
		     setMiercoles(patron.contains(PATRON_MIERCOLES));
		     setJueves(patron.contains(PATRON_JUEVES));
		     setViernes(patron.contains(PATRON_VIERNES));
		     setSabado(patron.contains(PATRON_SABADO));
		     traducirPatronUsuario(patron); 
		}
	}

	
	public OnNuevoPatronDiasSemanales getOnNuevoPatronDiasSemanales() {
		return onNuevoPatronDiasSemanales;
	}

	public void setOnNuevoPatronDiasSemanales(
			OnNuevoPatronDiasSemanales onNuevoPatronDiasSemanales) {
		this.onNuevoPatronDiasSemanales = onNuevoPatronDiasSemanales;
	}

	// setters
	public void setDomingo(boolean b) {
		chDomingo.setChecked(b); 
	}

	public void setLunes(boolean b) {
		chLunes.setChecked(b); 
	}

	public void setMartes(boolean b) {
		chMartes.setChecked(b); 
	}

	public void setMiercoles(boolean b) {
		chMiercoles.setChecked(b); 
	}

	public void setJueves(boolean b) {
		chJueves.setChecked(b); 
	}

	public void setViernes(boolean b) {
		chViernes.setChecked(b); 
	}

	public void setSabado(boolean b) {
		chSabado.setChecked(b); 
	}
	
	// getters
	public boolean isDomingo() {
		return chDomingo.isChecked(); 
	}

	public boolean isLunes() {
		return chLunes.isChecked(); 
	}

	public boolean isMartes() {
		return chMartes.isChecked(); 
	}

	public boolean isMiercoles() {
		return chMiercoles.isChecked(); 
	}

	public boolean isJueves() {
		return chJueves.isChecked(); 
	}

	public boolean isViernes() {
		return chViernes.isChecked(); 
	}

	public boolean isSabado() {
		return chSabado.isChecked(); 
	}
}
